# Celery配置
import os
from celery import Celery
from django.conf import settings

# 设置Django设置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'asset_management.settings')

app = Celery('asset_management')

# 使用Django设置配置Celery
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动发现任务
app.autodiscover_tasks()

# Celery配置
app.conf.update(
    # 任务序列化
    task_serializer='json',
    accept_content=['json'],
    result_serializer='json',
    timezone='Asia/Shanghai',
    enable_utc=True,
    
    # 结果后端
    result_backend='redis://localhost:6379/2',
    
    # 消息代理
    broker_url='redis://localhost:6379/3',
    
    # 任务路由
    task_routes={
        'assets.tasks.generate_reports': {'queue': 'reports'},
        'assets.tasks.process_bulk_import': {'queue': 'imports'},
        'assets.tasks.send_notifications': {'queue': 'notifications'},
        'assets.tasks.cleanup_old_data': {'queue': 'maintenance'},
    },
    
    # 任务执行配置
    task_always_eager=False,  # 生产环境设为False
    task_eager_propagates=True,
    task_ignore_result=False,
    task_store_eager_result=True,
    
    # 工作进程配置
    worker_prefetch_multiplier=1,
    worker_max_tasks_per_child=1000,
    
    # 任务超时配置
    task_soft_time_limit=300,  # 5分钟软超时
    task_time_limit=600,       # 10分钟硬超时
    
    # 重试配置
    task_acks_late=True,
    task_reject_on_worker_lost=True,
    
    # 定时任务配置
    beat_schedule={
        'cleanup-old-logs': {
            'task': 'assets.tasks.cleanup_old_logs',
            'schedule': 86400.0,  # 每天执行
        },
        'generate-daily-reports': {
            'task': 'assets.tasks.generate_daily_reports',
            'schedule': 3600.0,   # 每小时执行
        },
        'check-overdue-items': {
            'task': 'assets.tasks.check_overdue_items',
            'schedule': 1800.0,   # 每30分钟执行
        },
        'update-cache-stats': {
            'task': 'assets.tasks.update_cache_statistics',
            'schedule': 300.0,    # 每5分钟执行
        },
    },
)

@app.task(bind=True)
def debug_task(self):
    """调试任务"""
    print(f'Request: {self.request!r}')
    return 'Debug task completed'
